<!DOCTYPE html>
<html>
<head><meta name="generator" content="Hexo 3.9.0">
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  
  <title>python-demo | D&amp;Simon</title>
  
  <meta name="keywords" content="Simon">
  
  

  

  <meta name="HandheldFriendly" content="True">
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <!-- meta -->
  
  
  <meta name="theme-color" content="#FFFFFF">
  <meta name="msapplication-TileColor" content="#1BC3FB">
  <meta name="msapplication-config" content="https://cdn.jsdelivr.net/gh/xaoxuu/cdn-favicon@19.9.6/browserconfig.xml">
  

  <!-- link -->
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css">
  
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/node-waves@0.7.6/dist/waves.min.css">
  
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.10.1/css/all.min.css">
  
  
  <link rel="shortcut icon" type="image/x-icon" href="https://cdn.jsdelivr.net/gh/xaoxuu/cdn-favicon@19.9.6/favicon.ico">
  <link rel="icon" type="image/x-icon" sizes="32x32" href="https://cdn.jsdelivr.net/gh/xaoxuu/cdn-favicon@19.9.6/favicon-32x32.png">
  <link rel="apple-touch-icon" type="image/png" sizes="180x180" href="https://cdn.jsdelivr.net/gh/xaoxuu/cdn-favicon@19.9.6/apple-touch-icon.png">
  <link rel="mask-icon" color="#1BC3FB" href="https://cdn.jsdelivr.net/gh/xaoxuu/cdn-favicon@19.9.6/safari-pinned-tab.svg">
  <link rel="manifest" href="https://cdn.jsdelivr.net/gh/xaoxuu/cdn-favicon@19.9.6/site.webmanifest">
  

  
  <link rel="shortcut icon" type="image/x-icon" href="https://cdn.jsdelivr.net/gh/xaoxuu/assets@master/favicon/favicon.ico">
  

  
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/xaoxuu/cdn-material-x@19.9.9/css/style.css">
  

  <script>
    function setLoadingBarProgress(num) {
      document.getElementById('loading-bar').style.width=num+"%";
    }
  </script>

  
  
</head>

<body>
  
  
  <div class="cover-wrapper">
    <cover class='cover post half'>
      
        
  <h1 class='title'>D&Simon</h1>


  <div class="m_search">
    <form name="searchform" class="form u-search-form">
      <input type="text" class="input u-search-input" placeholder="" />
      <i class="icon fas fa-search fa-fw"></i>
    </form>
  </div>

<div class='menu navgation'>
  <ul class='h-list'>
    
      
        <li>
          <a class="nav home" href="/hblog/"
            
            
            id="hblog">
            <i class='fas fa-rss fa-fw'></i>&nbsp;文章
          </a>
        </li>
      
        <li>
          <a class="nav home" href="/hblog/projects/"
            
            
            id="hblogprojects">
            <i class='fas fa-code-branch fa-fw'></i>&nbsp;项目
          </a>
        </li>
      
        <li>
          <a class="nav home" href="/hblog/about/"
            
              rel="nofollow"
            
            
            id="hblogabout">
            <i class='fas fa-info-circle fa-fw'></i>&nbsp;关于
          </a>
        </li>
      
    
  </ul>
</div>

      
    </cover>
    <header class="l_header pure">
  <div id="loading-bar-wrapper">
    <div id="loading-bar" class="pure"></div>
  </div>

	<div class='wrapper'>
		<div class="nav-main container container--flex">
      <a class="logo flat-box" href='/hblog/' >
        
          D&Simon
        
      </a>
			<div class='menu navgation'>
				<ul class='h-list'>
          
  					
  						<li>
								<a class="nav flat-box" href="/hblog/"
                  
                  
                  id="hblog">
									<i class='fas fa-grin fa-fw'></i>&nbsp;文章
								</a>
							</li>
      			
  						<li>
								<a class="nav flat-box" href="/hblog/blog/categories/"
                  
                    rel="nofollow"
                  
                  
                  id="hblogblogcategories">
									<i class='fas fa-folder-open fa-fw'></i>&nbsp;分类
								</a>
							</li>
      			
  						<li>
								<a class="nav flat-box" href="/hblog/blog/tags/"
                  
                    rel="nofollow"
                  
                  
                  id="hblogblogtags">
									<i class='fas fa-hashtag fa-fw'></i>&nbsp;标签
								</a>
							</li>
      			
  						<li>
								<a class="nav flat-box" href="/hblog/blog/archives/"
                  
                    rel="nofollow"
                  
                  
                  id="hblogblogarchives">
									<i class='fas fa-archive fa-fw'></i>&nbsp;归档
								</a>
							</li>
      			
      		
				</ul>
			</div>

			
				<div class="m_search">
					<form name="searchform" class="form u-search-form">
						<input type="text" class="input u-search-input" placeholder="搜索" />
						<i class="icon fas fa-search fa-fw"></i>
					</form>
				</div>
			
			<ul class='switcher h-list'>
				
					<li class='s-search'><a class="fas fa-search fa-fw" href='javascript:void(0)'></a></li>
				
				<li class='s-menu'><a class="fas fa-bars fa-fw" href='javascript:void(0)'></a></li>
			</ul>
		</div>

		<div class='nav-sub container container--flex'>
			<a class="logo flat-box"></a>
			<ul class='switcher h-list'>
				<li class='s-comment'><a class="flat-btn fas fa-comments fa-fw" href='javascript:void(0)'></a></li>
        
          <li class='s-toc'><a class="flat-btn fas fa-list fa-fw" href='javascript:void(0)'></a></li>
        
			</ul>
		</div>
	</div>
</header>
	<aside class="menu-phone">
    <header>
		<nav class="menu navgation">
      <ul>
        
          
            <li>
							<a class="nav flat-box" href="/hblog/"
                
                
                id="hblog">
								<i class='fas fa-clock fa-fw'></i>&nbsp;近期文章
							</a>
            </li>
          
            <li>
							<a class="nav flat-box" href="/hblog/blog/archives/"
                
                  rel="nofollow"
                
                
                id="hblogblogarchives">
								<i class='fas fa-archive fa-fw'></i>&nbsp;文章归档
							</a>
            </li>
          
            <li>
							<a class="nav flat-box" href="/hblog/about/"
                
                  rel="nofollow"
                
                
                id="hblogabout">
								<i class='fas fa-info-circle fa-fw'></i>&nbsp;关于小站
							</a>
            </li>
          
       
      </ul>
		</nav>
    </header>
	</aside>
<script>setLoadingBarProgress(40);</script>

  </div>


  <div class="l_body">
    <div class='body-wrapper'>
      <div class='l_main'>
  

  <article id="post" class="post white-box article-type-post" itemscope itemprop="blogPost">
    


  <section class='meta'>
    
    
    <div class="meta" id="header-meta">
      
        
  
    <h1 class="title">
      <a href="/hblog/2020/03/12/python/demo/">
        python-demo
      </a>
    </h1>
  


      
      <div class='new-meta-box'>
        
          
        
          
            
  <div class='new-meta-item author'>
    
      <a href="/hblog/" rel="nofollow">
        
          <i class="fas fa-user" aria-hidden="true"></i>
        
        <p>Simon</p>
      </a>
    
  </div>


          
        
          
            <div class="new-meta-item date">
  <a class='notlink'>
    <i class="fas fa-calendar-alt" aria-hidden="true"></i>
    <p>2020-03-12</p>
  </a>
</div>

          
        
          
            
  
  <div class='new-meta-item category'>
    <a href='/hblog/blog/categories/Python/' rel="nofollow">
      <i class="fas fa-folder-open" aria-hidden="true"></i>
      <p>Python</p>
    </a>
  </div>


          
        
          
            
  
    <div class="new-meta-item browse busuanzi">
      <a class='notlink'>
        <i class="fas fa-eye" aria-hidden="true"></i>
        <p>
          <span id="busuanzi_value_page_pv">
            <i class="fas fa-spinner fa-spin fa-fw" aria-hidden="true"></i>
          </span>
        </p>
      </a>
    </div>
  


          
        
          
            

          
        
      </div>
      
        <hr>
      
    </div>
  </section>


    <section class="article typo">
      <div class="article-entry" itemprop="articleBody">
        <h1 id="Geek-Framework-微服务快速开发脚手架"><a href="#Geek-Framework-微服务快速开发脚手架" class="headerlink" title="Geek-Framework 微服务快速开发脚手架"></a>Geek-Framework 微服务快速开发脚手架</h1><h3 id="平台简介"><a href="#平台简介" class="headerlink" title="平台简介"></a>平台简介</h3><p>Geek-Framework是基于多个优秀的开源项目，高度整合封装而成的高效，高性能，强安全性的<strong>开源</strong>Java微服务快速开发框架。</p>
<p>Geek-Framework是在SpringBoot基础上搭建的一个Java基础开发框架，以Spring MVC为模型视图控制器，MyBatis为数据访问层，<br>Apache Shiro和Spring-Security为权限授权层，redis进行缓存。</p>
<p>Geek-Framework主要定位于微应用的开发，已内置后台系统的基础功能，用户管理、角色管理、权限管理、会员管理、日志管理等；前台已经实现用户登录，注册等基础功能。<br>同时前后台会员实现分表管理，可扩展多角色系统、多权限系统。<br>采用分层设计、双重验证、提交数据安全编码、密码加密、访问验证、数据权限验证。<br>使用Maven做项目管理，提高项目的易开发性、扩展性。</p>
<hr>
<h3 id="更新日期2019-01-16"><a href="#更新日期2019-01-16" class="headerlink" title="更新日期2019-01-16"></a>更新日期2019-01-16</h3><ul>
<li>升级springboot版本为2.1.2.RELEASE application.yml增加以下配置，兼容最新的springboot版本<blockquote>
<p>spring:main:allow-bean-definition-overriding: true</p>
</blockquote>
</li>
<li>移除j2cache支持，移除原因为简化新手用户部署系统配置</li>
<li>更改后台登录为单realm，不再支持多realm</li>
<li>优化日期时间工具类，使用Instant、LocalDateTime、LocalDate实现线性安全</li>
<li>修复Java开发规约中级警告及部分低级警告</li>
<li>增加debug日志输出开关</li>
</ul>
<h3 id="更新日期2018-12-28"><a href="#更新日期2018-12-28" class="headerlink" title="更新日期2018-12-28"></a>更新日期2018-12-28</h3><ul>
<li>项目增加健康检查暴露配置</li>
<li>根据JAVA开发手册对项目部分不符合开发手册的代码进行了修正，已修复高级警告、中级警告，由于低级警告较多，尚未修复，后续将持续修复</li>
<li>给前期已经使用项目的同学，可以使用【阿里巴巴Java开发规约插件p3c】进行修正，造成不便深表歉意</li>
</ul>
<h3 id="更新日期2018-10-08"><a href="#更新日期2018-10-08" class="headerlink" title="更新日期2018-10-08"></a>更新日期2018-10-08</h3><ul>
<li>最近学习了远程过程调用协议RPC（Remote Procedure Call Protocol),将本框架与dubbo做了一个集成，详见dubbo分支，</li>
<li>为了方便大学家习dubbo的运行机制，本框架将dubbo的provider和customer作了一个整合，将官方demo里的方多应用整合成了一个，即在同一应用内启动消费端和服务端</li>
<li>注：如有实际业务需要请将服务端与消费端分离，此处整合仅供学习dubbo的运行机制和思想</li>
</ul>
<h3 id="更新日期2018-09-19"><a href="#更新日期2018-09-19" class="headerlink" title="更新日期2018-09-19"></a>更新日期2018-09-19</h3><ul>
<li>升级mybatis包为mybatis-spring-boot-starter，移除原有mybatis包</li>
<li>升级mapper包为mapper-spring-boot-starter</li>
<li>升级pagehelper包为pagehelper-spring-boot-starter增加pagehelper-spring-boot-autoconfigure包</li>
<li>更改mybatis、mapper和pagehelper为自动配置，配置方式详见application.yml</li>
<li>移除MyBatisConfig.java和MybatisMapperScannerConfig.java文件</li>
<li>更改升级pagehelper之后对排序方式的处理方式</li>
<li>增加事务测试样例，详见AdminController的save方法，此坑很深，爬了一天，由于没有对spring事务的深入了解，导致事务一直不成功，原因在于spring事务只能处理没有被捕获的异常信息，如果对方法增加了事务，请尽量避免用catch来获取异常，或进在cache里面增加抛出异常功能，使事务能够访问到</li>
</ul>
<h3 id="更新日期2018-09-19-1"><a href="#更新日期2018-09-19-1" class="headerlink" title="更新日期2018-09-19"></a>更新日期2018-09-19</h3><ul>
<li>升级J2cache为2.7.0版本，主要修复channel获取次数过多导致的错误问题，另个j2cache后期可能会移除对jedis的支持，所以还是提前升级了吧</li>
<li>调整二级缓存redis为lettuce，lettuce为spring推荐的redis操作方式，另个j2cache也推荐使用</li>
<li>配置文件application.yml和j2cache配置文件都增加了对lettuce的支持</li>
<li>修改com.geekcattle.core.redis包下的RedisCacheManage为RedisShiroCacheManage,因为此文件名和spring源码中的一个文件重名，为了区分特此改名</li>
<li>优化RedisConfiguration的JedisConnectionFactory为LettuceConnctionFoctory</li>
</ul>
<h3 id="更新日期2018-09-11"><a href="#更新日期2018-09-11" class="headerlink" title="更新日期2018-09-11"></a>更新日期2018-09-11</h3><p>本次主要更新了后台两个常用功能组件</p>
<ul>
<li>文件上传组件：上传组件支持本地上传、阿里云OSS上传、七牛上传，使用之前需先进行相关的配置</li>
<li>编辑器组件：本组件使用百度UEditor作为编辑器插件，基础功能已经配置开发完成（编辑器初始加载、编辑器内容获取、文件上传等）</li>
</ul>
<h3 id="更新日期2018-06-20"><a href="#更新日期2018-06-20" class="headerlink" title="更新日期2018-06-20"></a>更新日期2018-06-20</h3><p>本次更新主要解决了前后台不能在同一浏览器登录的问题</p>
<ul>
<li>本次更新引入的spring-security用于对前台会员进行登录控制，后台管理仍使用shiro框架，前后台独立登录，不会出现挤掉另一端的BUG</li>
<li>spring-security已与JWT进行了完美的整合（不得不说spring家族的框架比shiro要好处理的太多了）</li>
<li>数据库更新，对前台会员表进行了更新，引入了spring-security最新的密码验证机制BCryptPasswordEncoder，使用随机密钥方式，移除了原有的密码盐方式</li>
<li>文件目录结构进行了优化调整</li>
<li>数据库备份文件至data/geekcattle.sql</li>
<li>修复上次提交时pom文件打包的错误</li>
<li>修复j2cache不同环境配置文件的配置</li>
<li>修复部署文件</li>
</ul>
<h3 id="更新日期2018-06-14"><a href="#更新日期2018-06-14" class="headerlink" title="更新日期2018-06-14"></a>更新日期2018-06-14</h3><p>更新说明：SpringBootAdmin已正式更名为Geek-Framework</p>
<ul>
<li>升级springboot1.5为了2.0，2.0版本变动比较大，1.5版本不可直接更新，如有需要可以查看更新记录</li>
<li>已经建立1.0版本分支，如果需1.0版本代码，可下载v1.0分支</li>
<li>整合了J2Cache二级缓存功能，J2Cache具体功能详见<a href="http://www.oschina.net/p/j2cache" target="_blank" rel="noopener">http://www.oschina.net/p/j2cache</a></li>
<li>原有单redis缓存功能仍可使用，具体仍用方法见代码注释</li>
</ul>
<p>PS:现有代码中有J2Cache的源代码，原因是因为发现了一个J2Cache的BUG，官方版本已经更新，但未同步至中央仓库，暂时用源码替代，待仓库更新后移除现在源代码</p>
<h3 id="更新日期2018-05-30"><a href="#更新日期2018-05-30" class="headerlink" title="更新日期2018-05-30"></a>更新日期2018-05-30</h3><ul>
<li>增加了JWT工具类</li>
<li>修复了jwt验证成功之后用户信息的传递，通过shiro的token登录传递，移除了以前的参数传递方法，此方法更为灵活好用</li>
<li>引入了refresh_token的概念</li>
</ul>
<h3 id="更新日期2017-11-07"><a href="#更新日期2017-11-07" class="headerlink" title="更新日期2017-11-07"></a>更新日期2017-11-07</h3><ul>
<li>项目整合redis存储，shiro可使用redisSession可使用于集群访问</li>
<li>项目增加jwt模式</li>
<li>增加默认启动模式为开发模式</li>
<li>优化已知BUG</li>
</ul>
<h2 id="内置功能"><a href="#内置功能" class="headerlink" title="内置功能"></a>内置功能</h2><ol>
<li>管理员管理：管理员是系统操作者，该功能主要完成系统管理员相关配置和角色授权。</li>
<li>角色管理：角色的基础功能以及角色分配权限。</li>
<li>菜单管理：配置系统菜单，操作权限，按钮权限标识等。</li>
<li>会员管理：对前台注册会员的基础的管理。</li>
<li>操作日志：系统正常操作日志记录和查询；系统异常信息日志记录和查询。</li>
</ol>
<h2 id="技术选型"><a href="#技术选型" class="headerlink" title="技术选型"></a>技术选型</h2><p>1、后端</p>
<ul>
<li>核心框架：SpringBoot 2.0.2.RELEASE</li>
<li>集成运行框架：Tomcat 8.5.31</li>
<li>安全框架：Apache Shiro 1.4 Spring-Security 5.0.5</li>
<li>视图框架：Spring MVC 5.0.6</li>
<li>服务端验证：Hibernate Validator 6.0.9</li>
<li>布局框架：Thymeleaf 3.0.9</li>
<li>持久层框架：MyBatis 3.3.1</li>
<li>数据处理框架：Mapper 3.3.9</li>
<li>数据库连接池：Alibaba Druid 1.0</li>
<li>缓存框架：Ehcache 3、Redis、J2Cache2.13</li>
<li>日志管理：Log4j</li>
<li>TOKEN模式： jsonwebtoken 0.6</li>
<li>工具类：Apache Commons、Jackson 2.9.5</li>
</ul>
<p>2、前端</p>
<ul>
<li>JQ框架：jQuery 2.2.4</li>
<li>JQ兼容插件：jQuery-Migrate 1.4.1</li>
<li>CSS框架：Twitter Bootstrap 3.3.7+AdminLte 2.3.7</li>
<li>客户端验证：jQuery Validate Plugin 1.15。</li>
<li>数据表格：BootStrap-Table 1.11</li>
<li>树数据列表：jQuery-Treegrid 0.2</li>
<li>树结构控件：BootStrap-Treeview 1.2</li>
<li>工具类框架：Layer 3.0</li>
</ul>
<p>4、平台</p>
<ul>
<li>服务器中间件：项目默认支持Tomcat8.5版本，如果需要打包部署到已有的Tomcat需做特殊处理后续会更新。</li>
<li>数据库支持：目前仅提供MySql数据库的支持，但不限于数据库，后续会增加其它数据库支持接口，</li>
<li>开发环境：Java1.8以上、IDEA、Maven 3.1以上、Git</li>
</ul>
<h2 id="安全考虑"><a href="#安全考虑" class="headerlink" title="安全考虑"></a>安全考虑</h2><ol>
<li>开发语言：系统采用Java 语言开发，具有卓越的通用性、高效性、平台移植性和安全性。</li>
<li>分层设计：（数据库层，数据访问层，业务逻辑层，展示层）层次清楚，低耦合，各层必须通过接口才能接入并进行参数校验（如：在展示层不可直接操作数据库），保证数据操作的安全。</li>
<li>双重验证：用户表单提交双验证：包括服务器端验证及客户端验证，防止用户通过浏览器恶意修改（如不可写文本域、隐藏变量篡改、上传非法文件等），跳过客户端验证操作数据库。</li>
<li>安全编码：用户表单提交所有数据，在服务器端都进行安全编码，防止用户提交非法脚本及SQL注入获取敏感数据等，确保数据安全。</li>
<li>密码加密：登录用户密码进行SHA1散列加密，此加密方法是不可逆的。保证密文泄露后的安全问题。</li>
<li>强制访问：系统对所有管理端链接都进行用户身份权限验证，防止用户直接填写url进行访问。</li>
</ol>
<h2 id="版权声明"><a href="#版权声明" class="headerlink" title="版权声明"></a>版权声明</h2><p>本软件使用 <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank" rel="noopener">Apache License 2.0</a> 协议，请严格遵照协议内容：</p>
<ol>
<li>需要给代码的用户一份Apache Licence。</li>
<li>如果你修改了代码，需要在被修改的文件中说明。</li>
<li><strong>在延伸的代码中（修改和有源代码衍生的代码中）需要带有原来代码中的协议，商标，专利声明和其他原来作者规定需要包含的说明。</strong></li>
<li>如果再发布的产品中包含一个Notice文件，则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可，但不可以表现为对Apache Licence构成更改。</li>
<li>Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售</li>
<li>你可以二次包装出售，<strong>但还请保留文件中的版权和作者信息</strong>，并在你的产品说明中注明SpringBootAdmin。</li>
<li>你可以以任何方式获得，你可以修改包名或类名，<strong>但还请保留文件中的版权和作者信息</strong>。</li>
</ol>

      </div>
      
        <br>
        


  <section class='meta' id="footer-meta">
    <div class='new-meta-box'>
      
        
          <div class="new-meta-item date" itemprop="dateUpdated" datetime="2020-03-12T00:00:00+08:00">
  <a class='notlink'>
    <i class="fas fa-clock" aria-hidden="true"></i>
    <p>更新于 Mar 12, 2020</p>
  </a>
</div>

        
      
        
          
  
  <div class="new-meta-item meta-tags"><a class="tag" href="/hblog/blog/tags/Python/" rel="nofollow"><i class="fas fa-tag" aria-hidden="true"></i><p>Python</p></a></div>


        
      
        
          

        
      
    </div>
  </section>


      
      
          <div class="prev-next">
              
              
                  <section class="next">
                      <span class="art-item-right" aria-hidden="true">
                          <h6>下一页&nbsp;<i class="fas fa-chevron-right" aria-hidden="true"></i></h6>
                          <h4>
                              <a href="/hblog/2019/11/12/springboot/demo/" rel="prev" title="springboot-demo">
                                  
                                      springboot-demo
                                  
                              </a>
                          </h4>
                          
                              
                              <h6 class="tags">
                                  <a class="tag" href="/hblog/blog/tags/springboot/"><i class="fas fa-tag fa-fw" aria-hidden="true"></i> springboot</a>
                              </h6>
                          
                      </span>
                  </section>
              
          </div>
      
    </section>
  </article>



  <!-- 显示推荐文章和评论 -->



  <article class="post white-box comments">
    <section class="article typo">
      <h4><i class="fas fa-comments fa-fw" aria-hidden="true"></i>&nbsp;评论</h4>
      
      
      
      
        <section id="comments">
          <div id="valine_container" class="valine_thread">
            <i class="fas fa-spinner fa-spin fa-fw"></i>
          </div>
        </section>
      
    </section>
  </article>






<!-- 根据页面mathjax变量决定是否加载MathJax数学公式js -->



  <script>
    window.subData = {
      title: 'python-demo',
      tools: true
    }
  </script>


</div>
<aside class='l_side'>
  
    
    
      
        
          
          
        
          
          
            
              
  <section class='widget toc-wrapper'>
    
<header class='pure'>
  <div><i class="fas fa-list fa-fw" aria-hidden="true"></i>&nbsp;&nbsp;本文目录</div>
  
    <!-- <div class='wrapper'><a class="s-toc rightBtn" rel="external nofollow noopener noreferrer" href="javascript:void(0)"><i class="fas fa-thumbtack fa-fw"></i></a></div> -->
  
</header>

    <div class='content pure'>
      <ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#Geek-Framework-微服务快速开发脚手架"><span class="toc-text">Geek-Framework 微服务快速开发脚手架</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#平台简介"><span class="toc-text">平台简介</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#更新日期2019-01-16"><span class="toc-text">更新日期2019-01-16</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#更新日期2018-12-28"><span class="toc-text">更新日期2018-12-28</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#更新日期2018-10-08"><span class="toc-text">更新日期2018-10-08</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#更新日期2018-09-19"><span class="toc-text">更新日期2018-09-19</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#更新日期2018-09-19-1"><span class="toc-text">更新日期2018-09-19</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#更新日期2018-09-11"><span class="toc-text">更新日期2018-09-11</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#更新日期2018-06-20"><span class="toc-text">更新日期2018-06-20</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#更新日期2018-06-14"><span class="toc-text">更新日期2018-06-14</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#更新日期2018-05-30"><span class="toc-text">更新日期2018-05-30</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#更新日期2017-11-07"><span class="toc-text">更新日期2017-11-07</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#内置功能"><span class="toc-text">内置功能</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#技术选型"><span class="toc-text">技术选型</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#安全考虑"><span class="toc-text">安全考虑</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#版权声明"><span class="toc-text">版权声明</span></a></li></ol></li></ol>
    </div>
  </section>


            
          
        
          
          
        
          
          
        
          
          
        
          
          
        
      
    

  
</aside>

<footer id="footer" class="clearfix">
  
  
    <div class="social-wrapper">
      
        
          <a href="/hblog/atom.xml"
            class="social fas fa-rss flat-btn"
            target="_blank"
            rel="external nofollow noopener noreferrer">
          </a>
        
      
        
          <a href="mailto:me@yunshine.com"
            class="social fas fa-envelope flat-btn"
            target="_blank"
            rel="external nofollow noopener noreferrer">
          </a>
        
      
        
          <a href="https://github.com/yunshine"
            class="social fab fa-github flat-btn"
            target="_blank"
            rel="external nofollow noopener noreferrer">
          </a>
        
      
        
          <a href="https://music.163.com/#/user/home?id=63035382"
            class="social fas fa-headphones-alt flat-btn"
            target="_blank"
            rel="external nofollow noopener noreferrer">
          </a>
        
      
    </div>
  
  <br>
  <div><p>footer.license</p>
</div>
  <div>
    本站使用
    <a href="https://xaoxuu.com/wiki/material-x/" target="_blank" class="codename">Material X</a>
    作为主题
    
      ，
      总访问量为
      <span id="busuanzi_value_site_pv"><i class="fas fa-spinner fa-spin fa-fw" aria-hidden="true"></i></span>
      次
    
    。
  </div>
</footer>
<script>setLoadingBarProgress(80);</script>


      <script>setLoadingBarProgress(60);</script>
    </div>
    <a class="s-top fas fa-arrow-up fa-fw" href='javascript:void(0)'></a>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.js"></script>

  <script>
    var GOOGLE_CUSTOM_SEARCH_API_KEY = "";
    var GOOGLE_CUSTOM_SEARCH_ENGINE_ID = "";
    var ALGOLIA_API_KEY = "";
    var ALGOLIA_APP_ID = "";
    var ALGOLIA_INDEX_NAME = "";
    var AZURE_SERVICE_NAME = "";
    var AZURE_INDEX_NAME = "";
    var AZURE_QUERY_KEY = "";
    var BAIDU_API_ID = "";
    var SEARCH_SERVICE = "hexo" || "hexo";
    var ROOT = "/hblog/"||"/";
    if(!ROOT.endsWith('/'))ROOT += '/';
  </script>

<script src="//instant.page/1.2.2" type="module" integrity="sha384-2xV8M5griQmzyiY3CDqh1dn4z3llDVqZDqzjzcY+jCBCk/a5fXJmuZ/40JJAPeoU"></script>


  <script async src="https://cdn.jsdelivr.net/npm/scrollreveal@4.0.5/dist/scrollreveal.min.js"></script>
  <script type="text/javascript">
    $(function() {
      const $reveal = $('.reveal');
      if ($reveal.length === 0) return;
      const sr = ScrollReveal({ distance: 0 });
      sr.reveal('.reveal');
    });
  </script>


  <script src="https://cdn.jsdelivr.net/npm/node-waves@0.7.6/dist/waves.min.js"></script>
  <script type="text/javascript">
    $(function() {
      Waves.attach('.flat-btn', ['waves-button']);
      Waves.attach('.float-btn', ['waves-button', 'waves-float']);
      Waves.attach('.float-btn-light', ['waves-button', 'waves-float', 'waves-light']);
      Waves.attach('.flat-box', ['waves-block']);
      Waves.attach('.float-box', ['waves-block', 'waves-float']);
      Waves.attach('.waves-image');
      Waves.init();
    });
  </script>


  <script async src="https://cdn.jsdelivr.net/gh/xaoxuu/cdn-busuanzi@2.3/js/busuanzi.pure.mini.js"></script>




  
  
  
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-backstretch/2.0.4/jquery.backstretch.min.js"></script>
    <script type="text/javascript">
      $(function(){
        if ('.cover') {
          $('.cover').backstretch(
          ["https://img.vim-cn.com/29/91197b04c13f512f734a76d4ac422d89dbe229.jpg"],
          {
            duration: "6000",
            fade: "2500"
          });
        } else {
          $.backstretch(
          ["https://img.vim-cn.com/29/91197b04c13f512f734a76d4ac422d89dbe229.jpg"],
          {
            duration: "6000",
            fade: "2500"
          });
        }
      });
    </script>
  









  <script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script>
  
    
      <script src="https://cdn.jsdelivr.net/gh/xaoxuu/volantis@1.0.5/js/volantis.min.js"></script>
    
  
  <script>
  var GUEST_INFO = ['nick','mail','link'];
  var guest_info = 'nick,mail,link'.split(',').filter(function(item){
    return GUEST_INFO.indexOf(item) > -1
  });
  var notify = 'true' == true;
  var verify = 'true' == true;
  var valine = new Valine();
  valine.init({
    el: '#valine_container',
    notify: notify,
    verify: verify,
    guest_info: guest_info,
    
    appId: "Emh00GVLxeMMy2d65c4v0bVU-gzGzoHsz",
    appKey: "iFy277TGGK2qaB5Fp0mImDIh",
    placeholder: "快来评论吧~",
    pageSize:'10',
    avatar:'mp',
    lang:'zh-cn',
    highlight:'true'
  })
  </script>



  <script src="https://cdn.jsdelivr.net/gh/xaoxuu/cdn-material-x@19.9/js/app.js"></script>


  <script src="https://cdn.jsdelivr.net/gh/xaoxuu/cdn-material-x@19.9/js/search.js"></script>




<!-- 复制 -->
<script src="https://cdn.jsdelivr.net/npm/clipboard@2/dist/clipboard.min.js"></script>
<script>
  let COPY_SUCCESS = "复制成功";
  let COPY_FAILURE = "复制失败";
  /*页面载入完成后，创建复制按钮*/
  !function (e, t, a) {
    /* code */
    var initCopyCode = function(){
      var copyHtml = '';
      copyHtml += '<button class="btn-copy" data-clipboard-snippet="">';
      copyHtml += '  <i class="fa fa-copy"></i><span>复制</span>';
      copyHtml += '</button>';
      $(".highlight .code pre").before(copyHtml);
      var clipboard = new ClipboardJS('.btn-copy', {
        target: function(trigger) {
          return trigger.nextElementSibling;
        }
      });

      clipboard.on('success', function(e) {
        //您可以加入成功提示
        console.info('Action:', e.action);
        console.info('Text:', e.text);
        console.info('Trigger:', e.trigger);
        success_prompt(COPY_SUCCESS);
        e.clearSelection();
      });
      clipboard.on('error', function(e) {
        //您可以加入失败提示
        console.error('Action:', e.action);
        console.error('Trigger:', e.trigger);
        fail_prompt(COPY_FAILURE);
      });
    }
    initCopyCode();

  }(window, document);

  /**
   * 弹出式提示框，默认1.5秒自动消失
   * @param message 提示信息
   * @param style 提示样式，有alert-success、alert-danger、alert-warning、alert-info
   * @param time 消失时间
   */
  var prompt = function (message, style, time)
  {
      style = (style === undefined) ? 'alert-success' : style;
      time = (time === undefined) ? 1500 : time*1000;
      $('<div>')
          .appendTo('body')
          .addClass('alert ' + style)
          .html(message)
          .show()
          .delay(time)
          .fadeOut();
  };

  // 成功提示
  var success_prompt = function(message, time)
  {
      prompt(message, 'alert-success', time);
  };

  // 失败提示
  var fail_prompt = function(message, time)
  {
      prompt(message, 'alert-danger', time);
  };

  // 提醒
  var warning_prompt = function(message, time)
  {
      prompt(message, 'alert-warning', time);
  };

  // 信息提示
  var info_prompt = function(message, time)
  {
      prompt(message, 'alert-info', time);
  };

</script>


<!-- fancybox -->
<script src="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js"></script>
<script>
  let LAZY_LOAD_IMAGE = "";
  $(".article-entry").find("fancybox").find("img").each(function () {
      var element = document.createElement("a");
      $(element).attr("data-fancybox", "gallery");
      $(element).attr("href", $(this).attr("src"));
      /* 图片采用懒加载处理时,
       * 一般图片标签内会有个属性名来存放图片的真实地址，比如 data-original,
       * 那么此处将原本的属性名src替换为对应属性名data-original,
       * 修改如下
       */
       if (LAZY_LOAD_IMAGE) {
         $(element).attr("href", $(this).attr("data-original"));
       }
      $(this).wrap(element);
  });
</script>





  <script>setLoadingBarProgress(100);</script>
</body>
</html>
